/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package BeansGerenciaveis;

import DAO.ApoioDao;
import DAO.AutorDao;
import DAO.Conexao;
import DAO.EditoraDao;
import DAO.FormatoDao;
import DAO.IdiomaDao;
import DAO.LivroOrganizadoDao;
import DAO.TemaDao;
import bean.Apoio;
import bean.Autor;
import bean.Capitulo;
import bean.Colecao;
import bean.LivroOrganizado;
import bean.Tema;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

/**
 *
 * @author fernando
 */
@ManagedBean
@SessionScoped
public class LivroOrganizadoBean implements Serializable {

    /**
     * Creates a new instance of LivroOrganizadoBean
     */
    
     public void selecionar() {
        livro = livros.getRowData();
    }
    
    public LivroOrganizadoBean() {
        this.livroDao = new LivroOrganizadoDao();
        this.livro = new LivroOrganizado();
        this.colecao = new Colecao();
        this.organizadorAdicionado = new Autor();
        
    }

    public void novoLivro() {
        this.livroDao = new LivroOrganizadoDao();
        this.livro = new LivroOrganizado();
        this.colecao = new Colecao();
        this.organizadorAdicionado = new Autor();
        this.carregarLivrosOrganizados();
    }

    public Colecao getColecao() {
        return colecao;
    }

    public void setColecao(Colecao colecao) {
        this.colecao = colecao;
    }

    public LivroOrganizadoDao getLivroDao() {
        return livroDao;
    }

    public void setLivroDao(LivroOrganizadoDao livroDao) {
        this.livroDao = livroDao;
    }

    public LivroOrganizado getLivro() {
        return livro;
    }

    public void setLivro(LivroOrganizado livro) {
        this.livro = livro;
    }

    public PreparedStatement getPs() {
        return ps;
    }

    public void setPs(PreparedStatement ps) {
        this.ps = ps;
    }

    

    public void setLivros(DataModel<LivroOrganizado> livros) {
        this.livros = livros;
    }

    public boolean isSucesso() {
        return sucesso;
    }

    public void setSucesso(boolean sucesso) {
        this.sucesso = sucesso;
    }

    public Conexao getConexao() {
        return conexao;
    }

    public void setConexao(Conexao conexao) {
        this.conexao = conexao;
    }

    public List<LivroOrganizado> getListaLivros() {
        if(listaLivros == null){
            this.carregarLivrosOrganizados();
        }
        return listaLivros;
    }

    public void setListaLivros(List<LivroOrganizado> listaLivros) {
        this.listaLivros = listaLivros;
    }

    public Autor getOrganizadorAdicionado() {
        return organizadorAdicionado;
    }

    public void setOrganizadorAdicionado(Autor organizadorAdicionado) {
        this.organizadorAdicionado = organizadorAdicionado;
    }

    public Apoio getApoioAdicionado() {
        return apoioAdicionado;
    }

    public void setApoioAdicionado(Apoio apoioAdicionado) {
        this.apoioAdicionado = apoioAdicionado;
    }

    public Tema getTemaAdicionado() {
        return temaAdicionado;
    }

    public void setTemaAdicionado(Tema temaAdicionado) {
        this.temaAdicionado = temaAdicionado;
    }

    public Capitulo getCapituloAdicionado() {
        return capituloAdicionado;
    }

    public void setCapituloAdicionado(Capitulo capituloAdicionado) {
        this.capituloAdicionado = capituloAdicionado;
    }

    public void setListaAutoresCapituloAdicionado(DataModel<Autor> listaAutoresCapituloAdicionado) {
        this.listaAutoresCapituloAdicionado = listaAutoresCapituloAdicionado;
    }

    public void addApoio() {
        ApoioDao ap = new ApoioDao();
        apoioAdicionado = ap.consultarApoio(apoioAdicionado.getId());
        this.livro.addApoio(apoioAdicionado);
        this.apoioAdicionado = new Apoio();
    }

    public void removerApoio() {
        boolean remover = this.livro.getApoios().remove(this.getApoio().getRowData());
    }

    public DataModel<Apoio> getApoio() {

        return new ListDataModel<Apoio>(this.livro.getApoios());

    }

    public void addTema() {
        TemaDao td = new TemaDao();
        temaAdicionado = td.consultarTema(temaAdicionado.getId());
        this.livro.addTema(temaAdicionado);
        this.temaAdicionado = new Tema();
    }

    public void removerTema() {
        boolean remover = this.livro.getTemas().remove(this.getTemas().getRowData());
    }

    public DataModel<Tema> getTemas() {

        return new ListDataModel<Tema>(this.livro.getTemas());

    }

    public String cadastroLivro() {
        String resultado = "/cadastros/acaoErro";

        livroDao = new LivroOrganizadoDao();

        //id 1 = Sem coleção
        this.colecao.setId(1);

        sucesso = livroDao.cadastrarLivro(livro, colecao);

        if (sucesso) {
            this.novoLivro();
            this.carregarLivrosOrganizados();
            return "/cadastros/obras/livrosOrganizados/cadastro/cadastroSucesso";

        }
        return resultado;
    }

    public String editarLivro() {
        String resultado = "/cadastros/acaoErro";

        livroDao = new LivroOrganizadoDao();

        //id 1 = Sem coleção
        this.colecao.setId(1);

        sucesso = livroDao.alterarLivro(livro, colecao);

        if (sucesso) {
            this.novoLivro();
            this.carregarLivrosOrganizados();
            return "/cadastros/acaoSucesso";

        }
        return resultado;
    }

    public String removerLivro() {
        String resultado = "/cadastros/acaoErro";

        livroDao = new LivroOrganizadoDao();

        //id 1 = Sem coleção
        this.colecao.setId(1);

        sucesso = livroDao.removerLivro(livro);

        if (sucesso) {
            this.novoLivro();
            this.carregarLivrosOrganizados();
            return "/cadastros/acaoSucesso";

        }

        return resultado;
    }

    public void addOrganizador() {
        AutorDao ad = new AutorDao();
        organizadorAdicionado = ad.consultaAutor(organizadorAdicionado.getId());
        this.livro.addOrganizador(organizadorAdicionado);

        this.organizadorAdicionado = new Autor();
    }

    public void removerOrganizador() {
        boolean remover = this.livro.getOrganizadores().remove(this.getOrganizadores().getRowData());
    }

    public DataModel<Autor> getOrganizadores() {

        return new ListDataModel<Autor>(this.livro.getOrganizadores());

    }

    public void addCapitulo() {
        this.livro.addCapitulo(capituloAdicionado);
        this.capituloAdicionado = new Capitulo();
    }

    public void removerCapitulo() {
        boolean remover = this.livro.getCapitulos().remove(this.getCapitulo().getRowData());
    }

    public DataModel<Capitulo> getCapitulo() {

        return new ListDataModel<Capitulo>(this.livro.getCapitulos());

    }

    public Autor getAutorAdicionadoCapitulo() {
        return autorAdicionadoCapitulo;
    }

    public void setAutorAdicionadoCapitulo(Autor autorAdicionadoCapitulo) {
        this.autorAdicionadoCapitulo = autorAdicionadoCapitulo;
    }

    public void addAutorCapitulo() {
        AutorDao ad = new AutorDao();
        System.out.println("Entrei no Método add Autor Capitulo: ");
        System.out.println(autorAdicionadoCapitulo.getRestanteNome() + autorAdicionadoCapitulo.getUltimoNome());
        System.out.println(autorAdicionadoCapitulo.getId());
        autorAdicionadoCapitulo = ad.consultaAutor(autorAdicionadoCapitulo.getId());
        if (this.autorAdicionadoCapitulo != null) {
            System.out.println("addAutorCapitulo executado:");
            System.out.println(autorAdicionadoCapitulo.getUltimoNome());
            this.capituloAdicionado.addAutor(autorAdicionadoCapitulo);
        }
        autorAdicionadoCapitulo = new Autor();
    }

    public DataModel<Autor> getListaAutoresCapituloAdicionado() {
        listaAutoresCapituloAdicionado = new ListDataModel<Autor>(this.capituloAdicionado.getAutores());
        return listaAutoresCapituloAdicionado;
    }

    public void removerAutorCapitulo() {

        boolean remover = this.capituloAdicionado.getAutores().remove(this.getListaAutoresCapituloAdicionado().getRowData());

    }

    public void buscarDadosObra() {
        if ((this.livro.getFormato() != null)) {
            FormatoDao fd = new FormatoDao();
            this.livro.setFormato(fd.consultarFormato(this.livro.getFormato().getId()));
        }
        if (this.livro.getIdioma() != null) {
            IdiomaDao id = new IdiomaDao();
            this.livro.setIdioma(id.consultarIdioma(this.livro.getIdioma().getId()));
        }
        if (this.livro.getEditora() != null) {
            System.out.println(this.livro.getEditora().getId());
            EditoraDao ed = new EditoraDao();
            this.livro.setEditora(ed.consultarEditora(this.livro.getEditora().getId()));
            System.out.println(this.livro.getEditora().getId());
            System.out.println(this.livro.getEditora().getNome());
        }
    }

   
    public DataModel<LivroOrganizado> getLivros() {
        if(this.livros == null){
            this.carregarLivrosOrganizados();
        }
        return livros;
    }
    
    public void carregarLivrosOrganizados(){
        System.out.println("Livro Bean - getLivros: Fui executado!");
        livroDao = new LivroOrganizadoDao();
        listaLivros = livroDao.listarLivros();
        livros = new ListDataModel<LivroOrganizado>(listaLivros);
    }
    
    
    private Colecao colecao;
    private LivroOrganizadoDao livroDao;
    private LivroOrganizado livro;
    private PreparedStatement ps;
    private DataModel<LivroOrganizado> livros;
    private boolean sucesso = false;
    private Conexao conexao;
    private List<LivroOrganizado> listaLivros;
    private Autor organizadorAdicionado = new Autor();
    private Apoio apoioAdicionado = new Apoio();
    private Tema temaAdicionado = new Tema();
    private Capitulo capituloAdicionado = new Capitulo();
    private Autor autorAdicionadoCapitulo = new Autor();
    private DataModel<Autor> listaAutoresCapituloAdicionado;
}
